package com.example.param;

import com.example.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: ws
 * Date: 2024-02-28
 * Time: 20:36
 * <p>
 * 接受前端的 param 参数
 */

@Controller
@RequestMapping("/param")
public class ParamController {


    /**
     * 直接接受
     * <p>
     * /param/data?name=ws&age=18
     * 形参列表，填写对应的参数即可
     * 要求：
     * 1. 名称相同
     * 2. 不传也不会报错
     */
    @RequestMapping("/data")
    @ResponseBody
    public String data(String name, Integer age) {
        System.out.println(name);
        System.out.println(age);
        return "success";
    }

    /**
     * 指定要求的必须传递，不指定的要给一个默认值
     * /param/data1?account=root&page=1
     * account必须传递，page 可以不必传递，默认值就是 1
     * value 指定前端的参数名，如何和后端的相同可以省略
     * required 是否强制传递该参数
     * defaultValue 当 request = false，时必须指定默认值
     */
    @ResponseBody
    @GetMapping("/data1")
    public String data1(@RequestParam(value = "account", required = true) String account,
                        @RequestParam(value = "page", required = false, defaultValue = "1") Integer page) {
        System.out.println("account:" + account);
        System.out.println("page:" + page);
        return account + ":" + page;
    }

    /**
     * 特殊值
     * 一名多值，key=18&key=19&key=20 直接使用集合接受
     * 同时必须使用 @RequestParam 注解
     * 不使用注解，会导致 key 对应的一个字符串直接赋值给集合，类型异常
     * 使用注解，就会 add 到该集合中
     *
     * /param/data2?key=18&key=19&key=20
     */
    @GetMapping("/data2")
    @ResponseBody
    public String data2(@RequestParam("key") List<Integer> key) {
        System.out.println(key);
        return key.toString();
    }

    /**
     * 使用实体类对象接受（但是前端的参数必须和实体类对应，不对应的接受不到）
     * /param/data3?name=ws&age=18
     */
    @ResponseBody
    @GetMapping("/data3")
    public String data3(User user) {
        System.out.println(user.getName());
        System.out.println(user.getAge());
        return user.toString();
    }

}
